package com.gourd.generator;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author gourd
 *
 */
public class MybatisPlusGenerator {

	/**
	 * 生成文件所在项目路径
	 */
	private static String baseProjectPath = "E:\\my\\workspace\\demo";
	/**
	 * 静态文件所在项目路径
	 */
	private static String viewProjectPath = "\\src\\main\\resources\\templates\\view\\";
	/**
	 * 基本包名
	 */
	private static String basePackage = "com.gourd.web.dic";
	/**
	 * 作者
	 */
	private static String authorName = "gourd";
	/**
	 * 要生成的表名
	 */
	private static String[] tables = { "sys_dic"};
	/**
	 * table前缀
	 */
	private static String prefix = "sys_";

	/**
	 * 生成自定义文件(html文件)开关
	 */
	private static Boolean htmlPage = false;
	private static File file = new File(basePackage);
	private static String path = file.getAbsolutePath();

	/**
	 * 数据库配置四要素
	 */
	private static String driverName = "com.mysql.cj.jdbc.Driver";
	private static String url = "jdbc:mysql://47.103.5.190:3306/gourd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true";
	private static String username = "root";
	private static String password = "gourd123";


	private static TableInfo tableInfo = null;

	public static void main(String[] args) {
		doMpGen();
	}

	public static void doMpGen() {

		System.out.println(path);
		//生成静态文件夹 否则静态文件不能生成到指定文件夹
		if (htmlPage) {
			for (String table : tables) {
				File fff = new File(baseProjectPath + viewProjectPath + table.replaceAll("_", ""));
				if (!fff.exists()) {
					fff.mkdirs();
				}
			}
		}
		// 自定义需要填充的字段
		//List<TableFill> tableFillList = new ArrayList<>();
		//tableFillList.add(new TableFill("ASDD_SS", FieldFill.INSERT_UPDATE));

		/**
		 * 1 代码生成器 整合配置
		 */
		AutoGenerator gen = new AutoGenerator();

		/**
		 * 2 数据库配置
		 */
		gen.setDataSource(new DataSourceConfig().setDbType(DbType.MYSQL).setDriverName(driverName).setUrl(url)
				.setUsername(username).setPassword(password).setTypeConvert(new MySqlTypeConvert() {
					// 自定义数据库表字段类型转换【可选】
					@Override
					public DbColumnType processTypeConvert(String fieldType) {
						System.out.println("转换类型：" + fieldType);
						 if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
						 	return DbColumnType.BOOLEAN;
						 }
						return super.processTypeConvert(fieldType);
					}
				}));

		/**
		 * 3 全局配置
		 */
		gen.setGlobalConfig(new GlobalConfig()
				// 输出目录
				.setOutputDir(baseProjectPath + "/src/main/java")
				// 是否覆盖文件
				.setFileOverride(true)
				// 开启 activeRecord 模式
				.setActiveRecord(true)
				// XML 二级缓存
				.setEnableCache(true)
				// XML ResultMap
				.setBaseResultMap(true)
				// XML columnList
				.setBaseColumnList(true)
				// 生成后打开文件夹
				.setOpen(false)
				.setAuthor(authorName)
				// 自定义文件命名，注意 %s 会自动填充表实体属性！
				.setMapperName("%sDao").setXmlName("%sMapper").setServiceName("%sService")
				.setServiceImplName("%sServiceImpl").setControllerName("%sController"));

		/**
		 * 4 策略配置
		 */
		gen.setStrategy(new StrategyConfig()
				// .setCapitalMode(true)// 全局大写命名
				// .setDbColumnUnderline(true)//全局下划线命名
				// 此处可以修改为您的表前缀
				.setTablePrefix(new String[] { prefix })
				// 表名生成策略
				.setNaming(NamingStrategy.underline_to_camel)
				// 需要生成的表
				.setInclude(tables)
				.setRestControllerStyle(true)
		// .setExclude(new String[]{"gente2"}) // 排除生成的表
		// 自定义实体父类
		// .setSuperEntityClass("com.baomidou.demo.TestEntity")
		// 自定义实体，公共字段
		 .setSuperEntityColumns(new String[]{"id","createdTime","createdBy","updatedTime","updatedBy","version"})
		// .setTableFillList(tableFillList)
		// 自定义 mapper 父类 默认BaseMapper
		// .setSuperMapperClass("com.baomidou.mybatisplus.mapper.BaseMapper")
		// 自定义 service 父类 默认IService
		// .setSuperServiceClass("com.baomidou.demo.TestService")
		// 自定义 service 实现类父类 默认ServiceImpl
		// .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
		// 自定义 controller 父类
		// .setSuperControllerClass("com.caocc.portal.controller.BaseController")
		// 【实体】是否生成字段常量（默认 false）
		// public static final String ID = "test_id";
		// .setEntityColumnConstant(true)
		// 【实体】是否为构建者模型（默认 false）
		// public User setName(String name) {this.name = name; return this;}
		// .setEntityBuilderModel(true)
		// 【实体】是否为lombok模型（默认 false）<a href="https://projectlombok.org/">document</a>
		 .setEntityLombokModel(true)
		// Boolean类型字段是否移除is前缀处理
		 .setEntityBooleanColumnRemoveIsPrefix(true)
		// .setControllerMappingHyphenStyle(true)
		);

		/**
		 * 5 包名策略配置
		 */
		gen.setPackageInfo(new PackageConfig()
				//模块名称，单独生成模块时使用！！！！！！！！！！！
				// .setModuleName("User")
				// 自定义包路径
				.setParent(basePackage)
				// 这里是控制器包名，默认 web
				.setController("controller")
				.setEntity("entity")
				.setMapper("dao")
				.setService("service")
				.setServiceImpl("service.impl")
				.setXml("mapper")
		);
		/**
		 * 6 注入自定义配置
		 */
		// 注入自定义配置，可以在 VM 中使用 cfg.abc 设置的值
		InjectionConfig abc = new InjectionConfig() {
			@Override
			public void initMap() {
				Map<String, Object> map = new HashMap<>(4);
				map.put("abc", "abc");
				this.setMap(map);
			}
		};
		gen.setCfg(abc);

		// 指定模板引擎 默认是VelocityTemplateEngine ，需要引入相关引擎依赖
		// gen.setTemplateEngine(new FreemarkerTemplateEngine());

		/**
		 * 7 模板配置
		 */
		gen.setTemplate(
				
				new TemplateConfig()
		// 自定义模板配置，模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
		// 至您项目 src/main/resources/template 目录下，模板名称也可自定义如下配置：
		 .setController("/templates/tv/controller.java.vm")
		// 关闭默认 xml 生成，调整生成 至 根目录
		 .setXml("/templates/tv/mapper.xml.vm")
		 .setEntity("/templates/tv/entity.java.vm")
		 .setMapper("/templates/tv/mapper.java.vm")
		 .setService("/templates/tv/service.java.vm")
		 .setServiceImpl("/templates/tv/serviceImpl.java.vm")
		);

		/**
		 * 8 执行生成
		 */
		gen.execute();

		List<TableInfo> tableInfoList = gen.getConfig().getTableInfoList();
		if (tableInfoList != null && tableInfoList.size() > 0) {
			tableInfo = tableInfoList.get(0);
			System.out.println(tableInfo.getEntityName());
		}

		System.out.println(gen.getCfg().getMap().get("abc"));
	}

}
